package com.desire.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;

/**
 * @author LittleDesire
 * @description
 * @date 2022-02-09 周三 21:28
 * @since 17
 */
public class _56_枚举 {

    /**
     * enum定义的枚举类默认继承了java.lang.Enum类,并实现了java.lang.Serializable和java.lang.Comparable 两个接口。
     * <p>
     * values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中：
     * <p>
     * values() 返回枚举类中所有的值。
     * ordinal()方法可以找到每个枚举常量的索引，就像数组索引一样。
     * valueOf()方法返回指定字符串值的枚举常量。
     *
     * @param args
     */
    public static void main(String[] args) {
        Color color = Color.BLUE;

        switch (color) {
            case RED -> System.out.println("红色");
            case BLACK -> System.out.println("黑色");
            case YELLOW -> System.out.println("黄色");
            default -> System.out.println("蓝色");
        }
        // valueOf()方法返回指定字符串值的枚举常量。
        System.out.println(Color.valueOf("RED"));

        // 获取枚举类的所有值
        for (Color value : Color.values()) {
            System.out.println(value);
        }
        //ordinal()方法可以找到每个枚举常量的索引，就像数组索引一样。
        for (Color value : Color.values()) {
            System.out.println(value + " : " + value.ordinal());
        }

        /**
         * 这个枚举类的常量提供了Java程序中注释可能出现的语法位置的简单分类。
         * 这些常量在Target元注释中被用来指定在什么地方可以合法地编写给定类型的注释。
         * 注释可能出现的语法位置被分为声明上下文(注释应用于声明)和类型上下文(注释应用于声明和表达式中使用的类型)。
         */
        for (ElementType value : ElementType.values()) {
            System.out.println(value);
        }

        /**
         * 注释保留政策。这个枚举类的常量描述了保留注释的各种策略。
         * 它们与Retention元注释接口一起使用，以指定注释将保留多长时间
         */
        for (var p : RetentionPolicy.values()) {
            System.out.println(p);
        }
    }


    enum Color {
        // 颜色
        RED, BLUE, YELLOW, BLACK
    }
}
